package graph.shapes;

import graph.parts.Shape;

import javax.vecmath.Vector2d;

import ogl.app.Texture;
import ogl.vecmath.Color;
import ogl.vecmath.Vector;
import ogl.vecmathimp.MatrixImp;
import shader.Shader;
import additional.Vertex;

import static ogl.vecmathimp.FactoryDefault.vecmath;

/**
 * Normaler Quader, nur dass der Mittelpunkt beim Zeichnen hier nicht im Nullpunkt liegt.
 * Das ist wichtig, damit im Shader die x-Koordinate als Abstand zur Flagpole gesehen
 * werden kann.
 * @author Johanna
 *
 */
public class FlagCuboid extends Shape {
		private float breite;
		private float tiefe;
		private float hoehe;

		/**
		 * 
		 * @param breite
		 * @param tiefe
		 * @param hoehe
		 */
		public FlagCuboid(float b, float t, float h) {
			super.setMatrix((MatrixImp) MatrixImp.identity);
			breite = b;
			tiefe = t;
			hoehe = h;
			
			initPoints();
			initColors();
			initNormals();
			initTextureCoord();
			initVertices();
		}
		
		private void initPoints() {
			
			p = new Vector[]{ 
					// 0 Links unten hinten
					vec(0, 0, 0), 
					// 1 Rechts unten hinten
					vec(breite,0, 0),
					// 2 Rechts oben hinten
					vec(breite, hoehe, 0), 
					// 3 Links oben hinten
					vec(0, hoehe, 0)
			};
		}

		private void initColors() {
			c = new Color[]{ 
				      col(1, 0, 0), 
				      col(1, 0, 0), 
				      col(1, 0, 0), 
				      col(1, 0, 0),
				      col(1, 1, 0), 
				      col(1, 1, 0), 
				      col(1, 1, 0), 
				      col(1, 1, 0) 
			};
		}

		private void initNormals() {
			n = new Vector[] {
					vec(0, 0, 1)
				};
		}

		private void initTextureCoord() {
			t = new Vector2d[] {
				new Vector2d (0f, 0f),
				new Vector2d (1f, 0f),
			    new Vector2d (1f, 1f),
			    new Vector2d (0f, 1f),
			};
		}

		private void initVertices() {
			vertices = new Vertex[] {
				    // back
				    v(p[0], c[0], n[0], t[0]), 
				    v(p[1], c[1], n[0], t[1]), 
				    v(p[2], c[2], n[0], t[2]), 
				    v(p[3], c[3], n[0], t[3])
			};
			
			initVertexData();
		}

		public void moveBy(float x, float y, float z) {
			super.setMatrix((MatrixImp) super.getMatrix().mult(vecmath.translationMatrix(x, y, z)));
		}
		
	}

